package org.example.servlet;

import org.example.dao.MessageDao;
import org.example.dao.UserDao;
import org.example.model.Message;
import org.example.model.MessageCenter;
import org.example.util.Util;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Date;
import java.util.List;

@ServerEndpoint("/message/{userId}")

public class MessageWebSocket {

    @OnOpen
    public void onOpen(@PathParam("userId")Integer userId, Session session) throws IOException {
        //1.把每个客户端的session保存起来，之后转发消息使用
        MessageCenter.addOnline(userId, session);
        //2.查询本客户端上次登录前的消息（从数据库查询）
        List<Message> list = MessageDao.queryByLastLogout(userId);
        //3.发送当前用户在上次登录后的消息
        for(Message m : list){
            session.getBasicRemote().sendText(Util.serialize(m));
        }
        System.out.println("建立连接："+userId);
    }



    @OnMessage
    public void onMessage(Session session, String message) throws IOException {
        //1.遍历保存所有客户端的session，每个都发送消息
        //MessageCenter.sendMessage(message);
        MessageCenter.getInstance().addMessage(message);
        //2.消息保存在数据库
        /**
         * ①反序列化，将json转为message对象
         * ②message对象设置接收消息的时间
         * ③插入数据库
         */
        Message msg = Util.deserialize(message, Message.class);
        //msg.setSendTime(new Date());
        int n = MessageDao.insert(msg);
        System.out.printf("接收到消息！%s\n", message);  //输出格式控制
    }


    @OnError
    public void onError(@PathParam("userId")Integer userId,Throwable error){
        System.out.println("连接出现错误！"+userId);
        //和关闭连接的操作一致
        MessageCenter.delOnline(userId);
        error.printStackTrace();
    }



    @OnClose
    public void onClose(@PathParam("userId")Integer userId){
        //1.本客户端关闭之前，要在之前保存的session集合中删除
        MessageCenter.delOnline(userId);
        //2.建立连接获取用户上次登录以后的消息，所以关闭长连接就代表用户退出
        //更新用户的上次登录时间，否则导致用户查看过的消息下一次登录后还能看到
        int n = UserDao.updateLastLogout(userId);
        System.out.println("关闭连接："+userId);

    }


}
